import time
import matplotlib.pyplot as plt

"""
实用类
"""

class Timer:
    "记录多次运行时间"
    def __init__(self):
        self.times = []
        self.tik = 0
        self.start()

    def start(self):
        "启动计时器"
        self.tik = time.time()

    def stop(self):
        "停止计时，并且将时间存储在列表中"
        self.times.append(time.time() - self.tik)
        return self.times[-1]

class Accmulator:
    "n个变量的累加器"
    def __init__(self, n):
        self.data = [0.0] * n

    def add(self, *args): # 注意这里的 *args 是不知道要传多少个参数，用的*args
        self.data = [a + float(b) for a, b in zip(self.data, args)]

    def reset(self):
        self.data = [0.0] * len(self.data)

    def __getitem__(self,idx):
        return self.data[idx]

"""
绘制图像函数
"""

def plot_scatter(x, y, size=20, title=None, xlabel=None, ylabel=None):
    """封装绘制的散点图"""

    plt.scatter(x,y,size)

    if title is not None:
        plt.title = title
    if xlabel is not None:
        plt.xlabel = xlabel
    if ylabel is not None:
        plt.ylabel = ylabel

    plt.show()

def plot(x, Y, xlabel=None, ylabel=None, legend_labels=None):
    plt.plot(x, Y)

    if xlabel:
        plt.xlabel= xlabel
    if ylabel:
        plt.ylabel= ylabel

    plt.show()

def plot_images(images, num_rows, num_cols, titles=None, save_path=r"D:\Study\d2l-zh\data\FashionMNIST\pic", save=0):
    """
    绘制三维矩阵中的二维灰度图像，将它们以指定的行数和列数排列。

    参数:
    - images: 三维numpy数组，形状为(num_images, height, width)，包含多个二维灰度图像。
    - num_rows: 网格的行数。
    - num_cols: 每行的列数。
    - titles: 可选，一个包含图像标题的列表，长度应与num_images相同或更短。

    返回:
    - 无，直接在matplotlib窗口中显示图像。
    """
    if len(images.shape) != 3:
        raise TypeError("images: 三维numpy数组，形状为(num_images, height, width)，包含多个二维灰度图像。")
    num_images = images.shape[0]

    #创建一个包含多个子图的图形
    fig, axes = plt.subplots(num_rows, num_cols,figsize=(19.2,10.8))

    #遍历图像并且绘制
    for i in range(num_images):
        row = i//num_cols
        col = i % num_cols

        if num_rows != 1:
            ax = axes[row, col]
        else:
            ax = axes[col]
        ax.imshow(images[i])
        ax.axis('off')

        if titles is not None and len(titles)> i:
            ax.set_title(titles[i])

    if save:
        plt.savefig(save_path)
        plt.close()
    else:
        plt.show()